package repositorio;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import model.Disciplina;

public class DisciplinaRepositorio {

	public boolean incluir(Disciplina entidade) {
		Connection con = null;
		PreparedStatement ps = null;
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("INSERT INTO DISCIPLINA (NOME, NR_CREDITOS, SEMESTRE) VALUES (?, ?, ?)");
			ps.setString(1, entidade.getNome());
			ps.setInt(2, entidade.getNrCreditos());
			ps.setInt(3, entidade.getSemestre());
			return (ps.executeUpdate() > 0);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			BDUtil.finalizeConnection(ps, con);
		}
	}

	public boolean atualizar(Disciplina entidade) {
		Connection con = null;
		PreparedStatement ps = null;
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("UPDATE DISCIPLINA SET NOME = ?, NR_CREDITOS = ?, SEMESTRE = ? WHERE NOME = ?");
			ps.setString(1, entidade.getNome());
			ps.setInt(2, entidade.getNrCreditos());
			ps.setInt(3, entidade.getSemestre());
			ps.setString(4, entidade.getNome());
			return ps.executeUpdate() > 0;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			BDUtil.finalizeConnection(ps, con);
		}
	}

	public boolean remover(Disciplina entidade) {
		Connection con = null;
		PreparedStatement ps = null;
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("DELETE FROM DISCIPLINA WHERE NOME = ?");
			ps.setString(1, entidade.getNome());
			return ps.executeUpdate() > 0;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			BDUtil.finalizeConnection(ps, con);
		}
	}

	public List<Disciplina> buscarTodos() {
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		Disciplina disciplina = null;
		List<Disciplina> list = new ArrayList<Disciplina>();
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("SELECT * FROM DISCIPLINA ORDER BY NOME");
			rs = ps.executeQuery();
			while (rs.next()) {
				disciplina = new Disciplina();
				disciplina.setNome(rs.getString("NOME"));
				disciplina.setNrCreditos(rs.getInt("NR_CREDITOS"));
				disciplina.setSemestre(rs.getInt("SEMESTRE"));
				list.add(disciplina);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			BDUtil.finalizeConnection(rs, ps, con);
		}
		return list;
	}

	public Disciplina buscarPorPk(Disciplina entidade) {
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		Disciplina disciplina = null;
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("SELECT * FROM DISCIPLINA WHERE NOME = ?");
			ps.setString(1, entidade.getNome());
			rs = ps.executeQuery();
			if (rs.next()) {
				disciplina = new Disciplina();
				disciplina.setNome(rs.getString("NOME"));
				disciplina.setNrCreditos(rs.getInt("NR_CREDITOS"));
				disciplina.setSemestre(rs.getInt("SEMESTRE"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			BDUtil.finalizeConnection(rs, ps, con);
		}
		return disciplina;
	}
	
	public List<Disciplina> buscarPorAluno(Integer nrMatriculaAluno) {
		Connection con =  null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		Disciplina disciplina = null;
		List<Disciplina> list = new ArrayList<Disciplina>();
		try {
			con = ConnectionFactory.getConnection();
			ps = con.prepareStatement("SELECT DISTINCT * " +
									  "FROM DISCIPLINA D " +
									  "INNER JOIN CONCEITO C ON C.NOME_DISCIPLINA = D.NOME " +
									  "INNER JOIN ALUNO A ON A.MATRICULA = C.MATRICULA_ALUNO " +
									  "WHERE A.MATRICULA = ?");
			ps.setInt(1, nrMatriculaAluno);
			rs = ps.executeQuery();
			while(rs.next()) {
				disciplina = new Disciplina();
				disciplina.setNome(rs.getString("NOME"));
				disciplina.setNrCreditos(rs.getInt("NR_CREDITOS"));
				disciplina.setSemestre(rs.getInt("SEMESTRE"));
				list.add(disciplina);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			BDUtil.finalizeConnection(rs, ps, con);
		}				
		return list;
	}

}
